"""
配置类模块
"""

from jlpay.exception.exceptions import ConfigException
from jlpay.utils.sm_utils import parse_private_key, parse_public_key


class OrgConfig:
    """机构配置类"""
    
    def __init__(self, builder):
        """
        从Builder创建OrgConfig实例
        
        Args:
            builder: OrgConfigBuilder实例
        """
        self.app_id = builder._app_id
        self.url = builder._url
        self.org_pri_key = builder._org_pri_key
        self.org_pub_key = builder._org_pub_key
        self.jlpay_pub_key = builder._jlpay_pub_key
        self.verify_org_no = builder._verify_org_no
        self.verify_merch_no = builder._verify_merch_no
        self.crypto_alg = builder._crypto_alg
        self.auto_encrypt = builder._auto_encrypt
        self.auto_decrypt = builder._auto_decrypt
        self.connect_timeout = builder._connect_timeout
        self.read_timeout = builder._read_timeout
        
        # 解析密钥
        if self.org_pri_key and self.jlpay_pub_key:
            self.org_pri_key_hex = parse_private_key(self.org_pri_key)
            self.jlpay_pub_key_hex = parse_public_key(self.jlpay_pub_key)
        
        # 解析机构公钥
        if self.org_pub_key:
            self.org_pub_key_hex = parse_public_key(self.org_pub_key)
    
    @staticmethod
    def builder():
        """返回一个新的OrgConfigBuilder实例"""
        return OrgConfig.OrgConfigBuilder()
    
    class OrgConfigBuilder:
        """机构配置构建器"""
        
        def __init__(self):
            """初始化Builder属性"""
            self._app_id = None
            self._url = None
            self._org_pri_key = None
            self._org_pub_key = None
            self._jlpay_pub_key = None
            self._verify_org_no = True
            self._verify_merch_no = True
            self._crypto_alg = "SM2WithSM4"  # 加密算法，默认使用SM2WithSM4
            self._auto_encrypt = True
            self._auto_decrypt = True
            self._connect_timeout = 10000  # 连接超时，单位毫秒
            self._read_timeout = 30000  # 读取超时，单位毫秒
        
        def app_id(self, app_id):
            """
            设置AppID
            
            Args:
                app_id: 嘉联分配的AppID
                
            Returns:
                OrgConfigBuilder实例
            """
            self._app_id = app_id
            return self
        
        def url(self, url):
            """
            设置请求地址
            
            Args:
                url: 嘉联请求地址
                
            Returns:
                OrgConfigBuilder实例
            """
            self._url = url
            return self
        
        def org_pri_key(self, org_pri_key):
            """
            设置机构私钥
            
            Args:
                org_pri_key: 机构私钥，PEM格式
                
            Returns:
                OrgConfigBuilder实例
            """
            self._org_pri_key = org_pri_key
            return self
        
        def org_pub_key(self, org_pub_key):
            """
            设置机构公钥
            
            Args:
                org_pub_key: 机构公钥，PEM格式
                
            Returns:
                OrgConfigBuilder实例
            """
            self._org_pub_key = org_pub_key
            return self
        
        def jlpay_pub_key(self, jlpay_pub_key):
            """
            设置嘉联公钥
            
            Args:
                jlpay_pub_key: 嘉联公钥，PEM格式
                
            Returns:
                OrgConfigBuilder实例
            """
            self._jlpay_pub_key = jlpay_pub_key
            return self
        
        def verify_org_no(self, verify_org_no):
            """
            设置是否校验机构号
            
            Args:
                verify_org_no: 是否校验机构号
                
            Returns:
                OrgConfigBuilder实例
            """
            self._verify_org_no = verify_org_no
            return self
        
        def verify_merch_no(self, verify_merch_no):
            """
            设置是否校验商户号
            
            Args:
                verify_merch_no: 是否校验商户号
                
            Returns:
                OrgConfigBuilder实例
            """
            self._verify_merch_no = verify_merch_no
            return self
        
        def crypto_alg(self, crypto_alg):
            """
            设置加密算法
            
            Args:
                crypto_alg: 加密算法，目前支持SM2+SM4
                
            Returns:
                OrgConfigBuilder实例
            """
            self._crypto_alg = crypto_alg
            return self
        
        def auto_encrypt(self, auto_encrypt):
            """
            设置是否自动加密敏感字段
            
            Args:
                auto_encrypt: 是否自动加密
                
            Returns:
                OrgConfigBuilder实例
            """
            self._auto_encrypt = auto_encrypt
            return self
        
        def auto_decrypt(self, auto_decrypt):
            """
            设置是否自动解密敏感字段
            
            Args:
                auto_decrypt: 是否自动解密
                
            Returns:
                OrgConfigBuilder实例
            """
            self._auto_decrypt = auto_decrypt
            return self
        
        def connect_timeout(self, connect_timeout):
            """
            设置连接超时时间
            
            Args:
                connect_timeout: 连接超时时间，单位毫秒
                
            Returns:
                OrgConfigBuilder实例
            """
            self._connect_timeout = connect_timeout
            return self
        
        def read_timeout(self, read_timeout):
            """
            设置读取超时时间
            
            Args:
                read_timeout: 读取超时时间，单位毫秒
                
            Returns:
                OrgConfigBuilder实例
            """
            self._read_timeout = read_timeout
            return self
        
        def build(self):
            """
            构建OrgConfig实例
            
            Returns:
                OrgConfig实例
                
            Raises:
                ConfigException: 配置参数不正确时抛出
            """
            # 验证必需参数
            if not self._app_id:
                raise ConfigException("appId不能为空")
            if not self._url:
                raise ConfigException("url不能为空")
            if not self._org_pri_key:
                raise ConfigException("机构私钥不能为空")
            if not self._jlpay_pub_key:
                raise ConfigException("嘉联公钥不能为空")
            if not self._org_pub_key:
                raise ConfigException("机构公钥不能为空")
            
            return OrgConfig(self) 